[iOS 10] UIPreviewInteraction を使ってアプリ上で Force Touch を受け付ける
Peak & Pop
UIPreviewInteraction は、ビューで Force Touch を受け取るために使う iOS 10 から追加されたクラスです。このクラスを使うと、特定のビューで Force Touch のインタラクションを受け取ることができます。
今回はこの UIPreviewInteraction を使って、アプリの画面上で Force Touch のイベントを受け取る実装を試したいと思います。
UIPreviewInteraction と UIPreviewInteractionDelegate
基本的には、UIPreviewInteraction のイニシャライザ引数に Force Touch に対応するビューを渡してインスタンス化するだけです。また、UIPreviewInteractionDelegate プロトコルをビューコントローラなどに準拠させ、そのビューコントローラを UIPreviewInteraction インスタンスの delegate
プロパティに代入します。
今回は、ルートのビューを対象とします。つまり画面全体です。
import UIKit class ViewController: UIViewController, UIPreviewInteractionDelegate { var previewInteraction: UIPreviewInteraction! override func viewDidLoad() { super.viewDidLoad() // インスタンス化 previewInteraction = UIPreviewInteraction(view: view) // delegateにビューコントローラを代入 previewInteraction.delegate = self } // required func previewInteraction(_ previewInteraction: UIPreviewInteraction, didUpdatePreviewTransition transitionProgress: CGFloat, ended: Bool) { print("プレビュー中! \(transitionProgress)") if ended { print("プレビュー完了!") } } func previewInteractionDidCancel(_ previewInteraction: UIPreviewInteraction) { print("キャンセル!") } // optional func previewInteraction(_ previewInteraction: UIPreviewInteraction, didUpdateCommitTransition transitionProgress: CGFloat, ended: Bool) { print("コミット中! \(transitionProgress)") if ended { print("コミット完了!") } } }
Force Touch は、ユーザーの押し具合によって大きく「プレビュー状態」と「コミット状態」の2段階に分かれています。previewInteraction(_:didUpdatePreviewTransition:)
メソッドはプレビュー状態の押し具合を受け取ることができるメソッドです。また、previewInteractionDidCancel(_:)
メソッドはキャンセルした時のイベントを受け取ることができるメソッドです。この2つのメソッドは必ず実装しなければいけません。
previewInteraction(_:didUpdateCommitTransition:)
は、コミット状態の押し具合を受け取ることができるメソッドです。Optional となっているため必ず実装しなければいけないというわけではありませんが、実際に試してみるとこの状態になることが多いので、実装することをお勧めします。
ブログ上では Force Touch の押し具合を紹介することはできませんが、print(_:)
関数で出力したログをコンソールで見てみると、下図のようになります。
まとめ
Force Touch が使えるデバイスは今の所まだ限られていますが、シェア率は日に日に高まっていくことでしょう。対応しておくと、ユーザーにとってより使いやすく、より楽しめるアプリになるのではないでしょうか。